声明的结构

  一个声明由四个部分组成:一个可选的“描述符”,一个基础类型,一个声明符,还有一个可选的初始式。除了函数和名字空间之外,其他声明都应该由分号结束。例如,

chr* kings[] = { "Antigonus", "Seleucus", "Ptolemy" };

这里的基础类型是char,声明符是*kings[],而初始式是 = { ... }。

  描述符是一个开始关键字,例如virtual(2.5.5节、12.2.6节)和extern(9.2节),它们说明了被声明事物的某些非类型的属性。

  声明符由一给名字和可选的若干声明运算符组成。最常用的声明运算符是(A.7.1节)

*         指针        前缀
*const    常量指针     前缀
&         引用        前缀
[]        数组        后缀
()        函数        后缀

如果这些东西都是前缀或者都是后缀,其使用就会很简单。但是,、[]和()被设计为模仿它们在表达式(6.2节)里的使用方式。这样,就是前缀的,而[]和()都是后缀的。而且后缀的声明运算符比前缀的那些声明运算符约束力更强。因此,*kings[] 就是一个指向什么东西的指针数组。还有,我们有时就必须使用括号,例如要表示“指向函数的指针”,见5.1节的例子。完整的细节请看附录A。

  请注意,在一个声明中不能没有类型。例如,

    const c = 7;        // 错误❌:无类型
    gt(int a, int b) { return (a>b)? a : b; }    // 错误❌:无返回类型

    unsigned ui;        // 可以:'unsigined' 就是 'unsigned int'
    long li;            // 可以:'long' 就是 'long int'

在这里,标准C++与C和C++的早期版本有所不同,原来一直将前面两个例子看成以int作为没有明确说明的类型(B.2节)。这种“隐式的int”是许多微妙错误和混乱的一个根源。

🔚